Me estoy mudando de React Native a Flutter/Dart. Tengo el siguiente fragmento de código del mecanografiado de React Native:
import CryptoJS from 'crypto-js'; export const decryptSessionKey = (randomKey: string, cipher: string) => { const iv = randomKey ? randomKey.slice(0, 16) : ''; const decrypted = CryptoJS.AES.decrypt( cipher, CryptoJS.enc.Utf8.parse(randomKey), { iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding, }, ); return decrypted.toString(CryptoJS.enc.Utf8); };Y moví ese código a flutter/dart como:
import 'dart:math'; import 'package:encrypt/encrypt.dart'; String decryptSessionKey(String randomKey, String cipher) { final encrypter = Encrypter(AES(Key.fromUtf8(randomKey), mode: AESMode.ctr, padding: null)); var iv = randomKey.substring(0, 16); final decrypted = encrypter.decrypt(Encrypted.fromUtf8(cipher), iv: IV.fromUtf8(iv)); return decrypted.toString(); } Dada la clave aleatoria como 0QaOUmxpugtnRUTZ6yOSxQeZq47Akiqf y el cifrado como piMgUF2ISUl/g7ns2/gZyaWQm6Rdv7x500GD7lMLYxhy14Tg+Bizibvz . Obtendría el descifrado en Typescript como 54387c3b38150d2a7a1c545167736e701629382648 .
Sin embargo, en Flutter, obtuve una cadena ilegible como ��ʋ�ͻh�0�M��R�Z���YInCXTI*��!�\��-S�f��/�SU��'
¿Se me escapa algo? ¡Gracias de antemano!
En el código Dart, el texto cifrado debe estar decodificado en Base64 y no codificado en UTF8:
final decrypted = encrypter.decrypt(Encrypted.from64(cipher), iv: IV.fromUtf8(iv)); // fromBase64() works also Esto no es necesario en el código JavaScript, donde CryptoJS.AES.decrypt() convierte implícitamente el texto cifrado codificado en Base64 en un objeto CipherParams .
Si esto se soluciona, ¡el descifrado funciona!
Tenga en cuenta la siguiente vulnerabilidad: en ambos códigos, los primeros 16 bytes de la clave de 32 bytes también se utilizan como IV. Si se aplica la misma clave varias veces, automáticamente se repiten los pares clave/IV. Especialmente para CRT, esto es inseguro, consulte ¿Por qué no se deben reutilizar IV/pares de claves en el modo CTR?
Por lo general, se genera un IV aleatorio para cada cifrado. El IV no es secreto y se envía junto con el texto cifrado (típicamente concatenado). En el lado de descifrado, el IV se quita y se usa para descifrar.